package com.ingta.framework.ibatis.util;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

/**
 * @author 作者 杨永兴:
 * @version 创建时间：2013-5-8 上午11:11:18 说明：
 */
public class JodaTimeUtils {

    public final static String DATE_FORMAT = "yyyy-MM-dd";
    public final static String MONTH_FORMAT = "yyyy-MM";
    public final static String TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public final static String DATE_CH_FORMAT = "yyyy年MM月dd日";
    public final static String YEAR_FORMAT = "yyyy";
    public static final String START_SUFFIX = "  23:59:59";
    public static final String END_SUFFIX = " 00:00:00";

    /**
     * 以友好的方式显示时间
     *
     * @param time
     * @return
     */
    public static String friendly_time(Date time) {
        if (time == null) {
            return "时间错误";
        }
        int ct = (int) ((System.currentTimeMillis() - time.getTime()) / 1000);
        if (ct < 3600) {
            return Math.max(ct / 60, 1) + "分钟前";
        }
        if (ct >= 3600 && ct < 86400) {
            return ct / 3600 + "小时前";
        }
        if (ct >= 86400 && ct < 2592000) { // 86400 * 30
            int day = ct / 86400;
            return (day > 1) ? day + "天前" : "昨天";
        }
        if (ct >= 2592000 && ct < 31104000) // 86400 * 30
        {
            return ct / 2592000 + "个月前";
        }
        return ct / 31104000 + "年前";
    }

    /**
     * 按格式解析日期格式的字符串
     *
     * @param dateTime 字符串类型的日期
     * @param format 日期格式
     * @return DateTime
     */
    public static DateTime parseString(String dateTime, String format) {
        DateTimeFormatter fmt = DateTimeFormat.forPattern(format);
        return fmt.parseDateTime(dateTime);
    }

    /**
     * 按格式解析时间为字符串
     *
     * @param dateTime 字符串类型的日期
     * @param format 日期格式
     * @return DateTime
     */
    public static String parseDateTime(DateTime dateTime, String format) {
        DateTimeFormatter fmt = DateTimeFormat.forPattern(format);
        return fmt.print(dateTime);
    }

    /**
     * 按格式解析时间为yyyy-MM-dd HH:mm:ss类型的字符串
     *
     * @param dateTime
     * @return
     */
    public static String parseDateTime(DateTime dateTime) {
        DateTimeFormatter fmt = DateTimeFormat.forPattern(TIME_FORMAT);
        return fmt.print(dateTime);
    }

    public static String getNowTime(String format) {
        return parseDateTime(new DateTime(), format);
    }

    public static String getNowTime() {
        return getNowTime(TIME_FORMAT);
    }

    public static String getAheadMonthTime(int num, String dateTime, String format) {
        DateTimeFormatter fmt = DateTimeFormat.forPattern(format);
        DateTime _dateTime = fmt.parseDateTime(dateTime);
        return fmt.print(_dateTime.minusMonths(num));
    }

    /**
     * 获取一个时间num个月数之前的时间
     *
     * @param num
     * @param dateTime
     * @return
     */
    public static String getAheadMonthTime(int num, String dateTime) {
        return getAheadMonthTime(num, dateTime, TIME_FORMAT);
    }

    /**
     * 获取一个时间num个月数之前的时间
     *
     * @param num
     * @return
     */
    public static DateTime getAheadMonthTime(int num) {
        DateTime _dateTime = new DateTime();
        return _dateTime.minusMonths(num);
    }

    /**
     * 判断前一个时间是否在后一个时间之前
     *
     * @param dateTime1
     * @param dateTime2
     * @param format
     * @return
     */
    public static boolean isBefore(String dateTime1, DateTime dateTime2, String format) {
        DateTime _dateTime1 = parseString(dateTime1, format);
        return _dateTime1.isBefore(dateTime2);
    }

    /**
     * 判断前一个时间是否在后一个时间之前
     *
     * @param dateTime1
     * @param dateTime2
     * @return
     */
    public static boolean isBefore(String dateTime1, DateTime dateTime2) {
        DateTime _dateTime1 = parseString(dateTime1, TIME_FORMAT);
        return _dateTime1.isBefore(dateTime2);
    }

    public static Map<String, Object> getTimeLimit(String startTime, String endTime) {
        Map<String, Object> map = new HashMap<String, Object>();
        startTime = StringUtils.isNotEmpty(startTime) ? startTime + START_SUFFIX : JodaTimeUtils
                .getNowTime();
        endTime = StringUtils.isNotEmpty(endTime) ? endTime + END_SUFFIX : JodaTimeUtils
                .getAheadMonthTime(IbatisParams.aheadMonth, startTime);
        map.put("startTime", startTime);
        map.put("endTime", endTime);
        return map;
    }
}
